package com.hzw.saas.api.group;

import java.util.List;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hzw.saas.api.group.bo.GroupBo;
import com.hzw.saas.api.group.bo.GroupLogBo;
import com.hzw.saas.api.group.bo.GroupMemberRoleBo;
import com.hzw.saas.api.group.query.GroupMsgQuery;
import com.hzw.saas.api.group.query.GroupQuery;
import com.hzw.saas.api.group.query.GroupUQuery;
import com.hzw.saas.api.group.query.UserInviteQuery;
import com.hzw.saas.common.config.util.PageParam;

/**
 * <p>
 * 用户组表 服务类
 * </p>
 *
 * @author sonam
 * @since 2020-12-23
 */
public interface IGroupService {

    boolean doesExist(String groupId);

    GroupBo getGroupById(String groupId);

    /**
     * 创建群组时，检查群组名称是否重复
     *
     * @param userId
     * @param groupName
     * @return
     */
    boolean doesExist(String userId, String groupName);

    /**
     * 尝试获取群组
     *
     * @param userId
     * @param groupId
     * @return
     */
    boolean tryGetGroup(String userId, String groupId);

    /**
     * 提交群组创建
     *
     * @param groupParam
     * @param userId
     * @return
     */
    GroupBo submitGroup(GroupQuery groupParam, String userId);

    /**
     * 删除群组
     *
     * @param groupId
     * @return
     */
    boolean delGroup(String groupId);

    /**
     * 修改群组
     *
     * @param group
     * @param userId
     * @return
     */
    boolean updateGroup(GroupUQuery group, String userId);

    /**
     *  指定userId以及群组群组名称，分页查询没有加入的群组集合
     * @param pageParam
     * @param groupName
     * @param userId
     * @return
     */
    IPage<GroupBo> searchGroupByUserAndGroupName(PageParam pageParam, String userId, String groupName);

    /**
     * 群组加入申请
     *
     * @param userId
     * @Param groupId
     */
    void requestJoinGroup(String userId, String groupId);

    /**
     * 主动邀请用户加入群组
     * @param userId  被邀请的用户
     * @param groupId  群组ID
     */
    void inviteUserJoinGroup(String userId, String groupId);

    /**
     * 获取本人所有群组信息
     *
     * @return
     */
    IPage<GroupMemberRoleBo> getAllGroupAndOther(IPage page, String userId);

    /**
     * 同意/拒绝成员加入群组
     *
     * @param groupMsgParam
     * return 错误信息
     */
    String confirmMember(GroupMsgQuery groupMsgParam);

    /**
     * 同意/拒绝群组的邀请
     *
     * @param userInviteParam
     * return 错误信息
     */
    String confirmGroup(UserInviteQuery userInviteParam);

    /**
     * 移除群组成员
     * @param groupId  群组ID
     * @param memberId 成员ID
     * @param operationUserId 操作得用户ID
     */
    void removeMemberByGroup(String groupId, String memberId, String operationUserId);

    /**
     * 离开群组
     *
     * @param userId
     * @param groupId
     */
    void leaveGroup(String userId, String groupId);

    /**
     * 获取群组动态
     *
     * @param page
     * @param groupId
     * @return
     */
    IPage<GroupLogBo> getGroupDynamicById(IPage page, String groupId);

    /**
     * 获取默认群组
     * @return
     */
    List<GroupBo> getDefaultGroupListByUserId(String userId);

    List<GroupBo> findNeedRefresh();

}
